﻿package core;


import scrn.*;
import dbase.*;


/**
 * 
 * 2010.04.07 - Изменение размеров окна<br />
 * 2010.04.02 - Удаление контактов<br />
 * - изменен интерфейс
 * 
 */

// ============================================================== Класс настроек
// All Static

public class Setting {

// Константы

public static final String VER = "25.01.2012"; // Заменён механизм отрисовки смайлов
public static boolean fLog = true; // Вести лог
//public static boolean fLog = false; // Вести лог
//public static String server = "localhost"; // Сервер
public static String server = "chs.molchat.net"; // Сервер
public static int port = 9707; // Порт сервера

//public static String login = "Tester"; //Логин
//public static String password = "123"; // Пароль
public static String login = null; //Логин
public static String password = null; // Пароль


public static final int COL_SCH_ONE_MAX = 3; // Макс. кол-во цветовых схем перс. контактов
public static final int COL_SCH_ROOM_MAX = 3; // Макс. кол-во цветовых схем комнат
public static final int MAX_ANI = 10; // Максимальное количество одновременно анимируемых смайлов
public static final int MAX_CACHE = 127; // Максимальное количество кешированных ников
public static final int MAX_FIND = 30; // Максимальное количество результатов поиска контактов
public static final int MAX_TEXT_LEN = 980; // Максимальная длина текста в сообщении
public static final int MAX_NICK_LEN = 24; // Максимальная длина ника
public static final int MAX_PASS_LEN = 24; // Максимальная длина пароля
public static final int MAX_ROOM = 15; // Максимальное колмчество комнат
public static final int MAX_ONE = 239; // Максимальное кол-во персональных контактов
public static final int MAX_ONSCREEN = 150; // Максимальное кол-во сообщений на экране для одного контакта
public static final int MAX_TO_OUT = 5; // Длина очереди исходящих сообщений

public static final int MIN_NICK_LEN = 2; // Минимальная длина ника
public static final int MIN_PASS_LEN = 4; // Минимальная длина пароля

public static final int TYPE = 2; // Тип клиента - телефон

//Номера настроек
public static final int CAM_IMG_ABIL = 60; // Возможные форматы снимков камеры
public static final int CAM_IMG_ENC = 61; // Формат снимков камеры
public static final int DISP_W = 15; // Размер экрана телефона
public static final int DISP_H = 16; // Размер экрана телефона
public static final int F_LOG = 20; // Вести лог
public static final int F_VIBRA = 11; // Вибрация
public static final int TIME_LOC_SHIFT = 30; // Смещение своих часов (в часах)
public static final int TIME_SER_SHIFT = 31; // Смещение часов сервера (в часах)
public static final int VOLUME = 12; // Громкость звука


// ====================================================================== Смайлы
public static final char SMILE_CHAR = '#'; // Символ смайла NO_REPLACE_CHAR
public static final char NO_REPLACE_CHAR = 'N'; // Символ замены смайла на пустоту

public static int smlMaxNick = 2; // Максимальное кол-во смайлов в нике
public static int smlMaxText = 4; // Максимальное кол-во смайлов в тексте одного сообщения
public static char smlRemNick = '.'; // Символ замены смайла в нике
public static char smlRemText = NO_REPLACE_CHAR; // Символ замены смайла в тексте


// Настройки

public static int tickSpeed = 96; // Скорость системных "тиков", мс

public static boolean fAnimate = false; // Анимировать смайлы (иначе - статичные)
//  private static final int cfAnimate = 0;
public static boolean fClk = true; // Отображать часы в углу
//  private static final int cfClk = 0;
public static boolean fClkSec = true; // Секунды на часах в углу
//  private static final int cfClkSec = 0;
public static boolean fGradient = true; // Использовать градиенты
//  private static final int cfGradient = 0;
public static boolean fGradSel = false; // Использовать градиент в селекторе
//private static final int cfGradient = 0;

public static boolean fRes = true; // Флаг подтверждения сообщений о доставке
//  private static final int cfRes = 0;

public static boolean fSmile = true; // Смайлы (если false - отображаются текстом)
//  private static final int cfSmile = 0;
//public static boolean fSound = true; // Звук
//private static final int cfSound = 13;
public static boolean fTime = true; // Отображать время в сообщениях
//  private static final int cfTime = 10;
public static boolean fVibra = true; // Вибрация

public static String inick = " > "; // Разделитель ников
public static int inLoginLen = 3; // Длина ника для заголовка временного окна при входящем сообщении
//  private static final int cinLoginLen = 0;
public static int maxFind = MAX_FIND; // Макс. кол-во контактов, возвращаемых при поиске
//  private static final int cMaxFind = 0;
public static String nickEnd = ": "; // Окончание ников
public static String servName = "Сервер"; // Название сервера

public static int timeLocShift = 2; // Смещение своих часов (в часах)

public static int timeSerShift = 0; // Смещение часов сервера (в часах)

public static int vibraMessTime = 80; // Длительность вибрации, мс
//  private static final int cVibraMessTime = 0;

public static int volume = 50; // Громкость звука

// Камера
public static String camImgEnc = null; // Формат снимков камеры
public static int camImgW = 160; // Ширина снимков камеры
public static int camImgH = 120; // Ширина снимков камеры


//================================================================ Инициализация
private Setting() {

}


//================================================= Прочитать основные настройки
public static void loadCore() {

	byte[] bytes = Man.dbMan.load(RMS.SETT_CORE, 1);
	if (bytes != null) {
		FromBytes ser = new FromBytes(bytes, 0);

		login = ser.readString();
		password = ser.readString();
	}
	Man.dbMan.close();
}


//========================================================== Прочитать настройки
public static void fromBytes(byte[] from) {

	FromBytes ser = new FromBytes(from, 0);

	while (ser.pt < from.length) {
		switch (ser.readInt()) { // Номер настройки
		//			case F_LOG:
		//				fLog = ser.readBool();
		//				break;
		case F_VIBRA:
			fVibra = ser.readBool();
			break;
		case VOLUME:
			volume = ser.readInt();
			break;
		case TIME_SER_SHIFT:
			timeSerShift = ser.readInt();
			break;
		case TIME_LOC_SHIFT:
			timeLocShift = ser.readInt();
			break;
		case Setting.CAM_IMG_ENC:
			camImgEnc = ser.readString();
			Mess.m("Setting.fromBytes", "Оптимальная кодировка: " + camImgEnc);
			break;
		}
	}

}


//========================================================== Загрузить настройки
public static void loadMain() {

	byte[] bytes = Man.dbMan.load(RMS.SETT, 1);
	if (bytes != null) {
		fromBytes(bytes);
		Mess.m("Setting.loadMain", "Настройки прочитаны");
	}
	Man.dbMan.close();
}


//================================================== Записать основные настройки
public static void saveCore() {

	ToBytes ser = new ToBytes(128);
	ser.putString(login);
	ser.putString(password);
	//	ser.writeString(server);
	//	ser.writeInt(port);
	Man.dbMan.save(RMS.SETT_CORE, ser.getBytes(), 1);
}


//=========================================================== Записать настройки
public static void saveMain() {

	Man.dbMan.save(RMS.SETT, toBytes(new int[] { F_LOG, F_VIBRA, VOLUME,
			TIME_SER_SHIFT, TIME_LOC_SHIFT }), 1);
	Mess.m("Setting.saveMain", "Настройки сохранены");
}


//================================================================ Сериализовать
public static byte[] toBytes(int[] whats) {

	ToBytes ser = new ToBytes(4096);

	for (int q = whats.length - 1; q >= 0; --q) {
		switch (whats[q]) {
		case Setting.DISP_W:
			ser.putInt(Setting.DISP_W);
			ser.putInt(Draw.dispW);
			break;
		case Setting.DISP_H:
			ser.putInt(Setting.DISP_H);
			ser.putInt(Draw.dispH);
			break;
		case Setting.F_LOG:
			ser.putInt(Setting.F_LOG);
			ser.putBool(fLog);
			break;
		case Setting.F_VIBRA:
			ser.putInt(Setting.F_VIBRA);
			ser.putBool(fVibra);
			break;
		case Setting.VOLUME:
			ser.putInt(Setting.VOLUME);
			ser.putInt(volume);
			break;
		case Setting.TIME_SER_SHIFT:
			ser.putInt(Setting.TIME_SER_SHIFT);
			ser.putInt(timeSerShift);
			break;
		case Setting.TIME_LOC_SHIFT:
			ser.putInt(Setting.TIME_LOC_SHIFT);
			ser.putInt(timeLocShift);
			break;
		case Setting.CAM_IMG_ABIL:
			ser.putInt(Setting.CAM_IMG_ABIL);
			//				ser.writeString(System.getProperty("video.snapshot.encodings"));
			ser.putString(null);
			break;
		case Setting.CAM_IMG_ENC:
			ser.putInt(Setting.CAM_IMG_ENC);
			ser.putString(camImgEnc);
			break;
		}
	}

	return ser.getBytes();
}


}
